import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { DictData } from 'src/database/entitys/dict-data.entity';
import { CreateDictDataDto } from 'src/modules/system/dict/dict-data/dto/create-dict-data.dto';

@Injectable()
export class DictDataService {
  constructor(
    @InjectRepository(DictData)
    private dictDataRepository: Repository<DictData>
  ) {}

  /**
   * 查询字典数据列表
   * @param dicDto 查询参数，包含dictId等条件
   * @returns 返回符合条件的字典数据列表
   * @description 根据字典类型ID查询对应的字典数据列表
   */
  async findAll(dicDto: Partial<DictData>): Promise<DictData[]> {
    return await this.dictDataRepository.find({
      where: {
        dictId: dicDto.dictId,
      },
    });
  }

  /**
   * 创建字典数据
   * @param createDictDataDto 创建字典数据的DTO对象
   * @returns 返回创建成功的字典数据实体
   * @description 创建新的字典数据，会校验标签是否重复
   * @throws Error 当字典标签重复时抛出异常
   */
  async create(createDictDataDto: CreateDictDataDto): Promise<DictData> {
    // 检查是否存在相同label的字典数据
    const existingDictData = await this.dictDataRepository.findOne({
      where: {
        label: createDictDataDto.label,
        dictId: createDictDataDto.dictId,
      },
    });

    if (existingDictData) {
      throw new Error(`字典标签 "${createDictDataDto.label}" 已存在`);
    }

    const dictData = this.dictDataRepository.create(createDictDataDto);
    return await this.dictDataRepository.save(dictData);
  }

  /**
   * 更新字典数据
   * @param dictDataId 字典数据ID
   * @param updateDictDataDto 更新的字典数据对象
   * @returns 返回更新后的字典数据实体
   * @description 更新指定ID的字典数据
   * @throws NotFoundException 当字典数据不存在时抛出异常
   * @throws Error 当字典标签重复时抛出异常
   */
  async update(dictDataId: number, updateDictDataDto: Partial<DictData>): Promise<DictData> {
    const existingDictData = await this.dictDataRepository.findOne({
      where: { dictDataId },
    });

    if (!existingDictData) {
      throw new NotFoundException(`ID为${dictDataId}的字典数据不存在`);
    }

    await this.dictDataRepository.update(dictDataId, updateDictDataDto);
    return await this.dictDataRepository.findOne({ where: { dictDataId } });
  }

  /**
   * 删除字典数据
   * @param dictDataId 字典数据ID
   * @returns void
   * @description 删除指定ID的字典数据
   * @throws NotFoundException 当字典数据不存在时抛出异常
   */
  async remove(dictDataId: number): Promise<void> {
    const existingDictData = await this.dictDataRepository.findOne({
      where: { dictDataId },
    });

    if (!existingDictData) {
      throw new NotFoundException(`ID为${dictDataId}的字典数据不存在`);
    }

    await this.dictDataRepository.delete(dictDataId);
  }
}
